package br.ucb.tcc.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;

import br.ucb.tcc.entidades.Perfil;
import br.ucb.tcc.negocio.TwitterBean;
import br.ucb.tcc.persistencia.TwitterDAO;
import br.ucb.tcc.validation.CampoObrigatorioValidator;

import net.java.dev.designgridlayout.DesignGridLayout;

import thinlet.swing.border.LineBorder;
import thinlet.swing.container.ToolFooter;
import thinlet.swing.table.Cell;
import thinlet.swing.table.Table;
import twitter4j.ResponseList;
import twitter4j.TwitterException;
import twitter4j.User;

/**
 * 
 * Frame que representara a busca de usuarios por nome.
 * 
 * @author italoricci
 *
 */
public class BuscarPorUsuarioPanel extends AbstractPanel implements Table.Listener<Perfil>, ActionListener {


	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JScrollPane scrollPane;
	private ToolFooter subPanelHeader;
	private JTextField campoPesquisa;
	private JButton pesquisarButton;
	private JButton limparPesquisaButton;
	private JButton salvarUsuarioButton;
	private JPanel acoesPanel;
	private Table<Perfil> lista;
	private List<Perfil> perfilDTOs;
	URL imgsrc = Main.class.getResource("icon/twitter-banner.jpg");
	

	/**
	 * 
	 */
	public BuscarPorUsuarioPanel() {
		super(new BorderLayout());
		JPanel header = new JPanel(new BorderLayout());
		subPanelHeader = new ToolFooter();
		JLabel lbHeader = new JLabel("<html><body>" + "<table><tr><td>" + "<img width='650' height='100' src='" + imgsrc + "'></img>" + "</td><td><h3>Buscar usuário</h3></td></tr></table></body></html>");
		lbHeader.setBorder(new LineBorder(Color.lightGray, 0, 0, 1, 0, 0, 8, 8, 8));
		lbHeader.setBackground(new Color(0xdddddd));
		lbHeader.setOpaque(true);
		subPanelHeader.add(getCampoPesquisa());
		subPanelHeader.add(getPesquisarButton());
		header.add(lbHeader, BorderLayout.CENTER);
		header.add(subPanelHeader, BorderLayout.SOUTH);
		add(header, BorderLayout.NORTH);
		popularLista();
		scrollPane = new JScrollPane(lista);
		scrollPane.setBorder(BorderFactory.createEmptyBorder());
		add(scrollPane, BorderLayout.CENTER);
		add(getAcoesPainel(), BorderLayout.SOUTH);
	}
	
	public void popularLista() {
		lista = new Table<Perfil>();
		lista.setCells(Perfil.class, new Cell("id"), new Cell("nomePerfil").setColor(new Color(0x4a77ce)), new Cell("nomeExibicao").setColor(new Color(0x4a77ce))
				, new Cell("qtdSeguidores").setColor(new Color(0x4a77ce)), new Cell("qtdAmigos").setColor(new Color(0x4a77ce)), new Cell("ultimoPost").setColor(new Color(0x4a77ce)));
		lista.addListListener(this);
	}
	
	public void updateLista(List<Perfil> perfis) {
		popularLista();
		this.remove(scrollPane);
		for (Perfil perfilDTO : perfis) {
			lista.addItem(perfilDTO);
		}
		scrollPane = new JScrollPane(lista);
		scrollPane.setBorder(BorderFactory.createEmptyBorder());
		add(scrollPane, BorderLayout.CENTER);
		this.revalidate();
	}
	
	public void limparLista() {
		lista.setModel(null);
		lista.repaint();
		this.revalidate();
	}
	
	

	public JPanel getAcoesPainel() {
		if (acoesPanel == null) {
			acoesPanel = new JPanel();
			DesignGridLayout designGridLayout = new DesignGridLayout(acoesPanel);
			designGridLayout.row().center().add(getSalvarUsuarioButton()).add(getLimparPesquisaButton());
		}
		return acoesPanel;
	}
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}
	
	public JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
		}
		return scrollPane;
	}


	public ToolFooter getSubPanelHeader() {
		if (subPanelHeader == null) {
			subPanelHeader = new ToolFooter();
		}
		
		return subPanelHeader;
	}


	public JTextField getCampoPesquisa() {
		if (campoPesquisa == null) {
			campoPesquisa = new JTextField(10);
			campoPesquisa.setInputVerifier(new CampoObrigatorioValidator(campoPesquisa));
		}
		
		return campoPesquisa;
	}


	public JButton getPesquisarButton() {
		if (pesquisarButton == null) {
			pesquisarButton = new JButton();
			pesquisarButton.setText("Pesquisar Usuário");
			pesquisarButton.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent arg0) {
					if (campoPesquisa.getText() != null && !campoPesquisa.getText().equals("")) {
						try {
							ResponseList<User> usuariosPesquisados = TwitterBean.obterUsuarioPorQuery(campoPesquisa.getText());
							
							if (usuariosPesquisados.isEmpty()) {
								mostrarMensagemInformativa("Nenhum registro encontrado", "Resultado Pesquisa");
							} else {
								perfilDTOs = new ArrayList<Perfil>(0);
								for (User user : usuariosPesquisados) {
									perfilDTOs.add(TwitterBean.montarPerfilDTO(user));
								}
								updateLista(perfilDTOs);
							}
						} catch (TwitterException e) {
							mostrarMensagemInformativa("Erro na integração:" + e.getMessage(), "Erro");
						}
					} else {
						mostrarMensagem("Campo obrigatório nome não preenchido.");
					}
				}
			});
		}
		return pesquisarButton;
	}

	public JButton getLimparPesquisaButton() {
		if (limparPesquisaButton == null) {
			limparPesquisaButton = new JButton();
			limparPesquisaButton.setText("Limpar");
			limparPesquisaButton.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent arg0) {
					getCampoPesquisa().setText(null);
					updateLista(new ArrayList<Perfil>(0));
				}
			});
		}
		return limparPesquisaButton;
	}


	public JButton getSalvarUsuarioButton() {
		if (salvarUsuarioButton == null) {
			salvarUsuarioButton = new JButton();
			salvarUsuarioButton.setText("Salvar Usuários");
			salvarUsuarioButton.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					if (perfilDTOs != null && !perfilDTOs.isEmpty())  {
						TwitterDAO dao = new TwitterDAO();
						dao.inserirPerfis(perfilDTOs);
						mostrarMensagem("Perfis salvos com sucesso!");
						getCampoPesquisa().setText(null);
						popularLista();
					} else {
						mostrarMensagem("Para salvar perfis e necessário efetuar uma pesquisa.");
					}
				}
			});
		}
		return salvarUsuarioButton;
	}


	@Override
	public void selectionChanged(ListSelectionEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doubleClicked(Perfil arg0) {
		String montarDetalhamento = montarDetalhamento(arg0);
		JLabel lbHeader = new JLabel(montarDetalhamento);
		lbHeader.setBorder(new LineBorder(Color.lightGray, 0, 0, 1, 0, 0, 8, 8, 8));
		lbHeader.setBackground(new Color(0xdddddd));
		lbHeader.setOpaque(true);
		JOptionPane.showMessageDialog(null, lbHeader, "Detalhamento de Usuário", JOptionPane.PLAIN_MESSAGE, null);  
		
	}
	
}
